package data.elements;

import java.util.Calendar;
import java.util.Random;
import java.util.Vector;

/**rappresenta l'archivio totale delle domande: al suo interno sono immagazzinate tutte le domande che il software conosce, divise per categoria
 * 
 * @author koldar
 * @version 1.0
 *
 */
public class QuestionArchive extends Vector<Category>{

	private static final long serialVersionUID = -5905427761033522984L;
	private static final Random randomgenerator=new Random(Calendar.getInstance().getTimeInMillis());
	
	/**indica il numero di cateogrie ancora selezionate dall'utente*/
	private int selectedcategories; 
	
	/**costruisce un nuovo archivio domande per categoria con numero di categorie selezionate dall'utente pari a zero
	 * 
	 * @param size dimensione iniziale dell'archivio
	 * @param increment incremento in caso di sforo archivio
	 */
	public QuestionArchive(int size,int increment){
		super(size,increment);
		this.selectedcategories=0;
	}
	
	/**pesca una domanda a caso tra le categorie che sono state scelte dall'utente. in caso l'utente non abbia selezionato neppure
	 * una categoria, il metodo ritorna NULL. se invece e' stata scelta almeno una categoria il metodo procede con un ciclo infito
	 * in cui si seleziona una categoria a caso e, se essa e' stata scelta dall'utente, pesca una domanda a caso.
	 * 
	 * @return se c'e' almeno una categoria selezionata, una domanda, altrimenti NULL
	 */
	public Question getRandomQuestion(){
		if (this.selectedcategories==0){
			return null;
		}
		while (true){
			Category ctg_picked=this.get(randomgenerator.nextInt(this.size()));
			if (!ctg_picked.isSelected()){
				continue;
			}
			return ctg_picked.getRandomQuestion(randomgenerator);
		}
	}
	
	/**imposta un certo valore selected ad una particolare categoria
	 * 
	 * @param i ID della categoria
	 * @param value valore da impostare
	 */
	public void setstatus(int i,boolean value){
		this.get(i).setSelected(value);
	}
	
	/**imposta un certo valore di scelta utente a tutte le categorie 
	 * 
	 * @param value valore da impostare
	 */
	public void setstatusall(boolean value){
		for (int i=0;i<this.size();i++){
			this.setstatus(i, value);
		}
	}

	/**
	 * @return the selectedcategories
	 */
	public int getSelectedcategories() {
		return selectedcategories;
	}

	/**
	 * @param selectedcategories the selectedcategories to set
	 */
	public void setSelectedcategories(int selectedcategories) {
		this.selectedcategories = selectedcategories;
	}
	/**incrementa di un'unita' le categorie selzionate
	 * 
	 */
	public void incSelectedcategories(){
		this.selectedcategories++;
	}
	/**decrementa di un'unita' le categorie selzionate
	 * 
	 */
	public void decSeleectedcategories(){
		this.selectedcategories--;
	}
	/**aggiunge al numero di categorie selezionate il numero passato come parametro
	 * 
	 * @param delta il numero da aggiungere al selected categories
	 */
	public void addSelectedcategories(int delta){
		this.selectedcategories+=delta;
	}
	
	

}
